package com.geek.javase.ch18.videodemo.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *@Date 2025/11/6
 *@Author wangpeng
 *@Description TODO
 * 一.元注解概述
 *     1.Java官方提供的注解
 *     2.用来定义注解的注解
 *     3.任何官方提供的非元注解的定义都使用到了元注解。
 *
 * 二.常用的元注解
 *     1.@Target
 *         * 作用：用来标识注解使用的位置，如果没有使用该注解标识，则自定义的注解可以使用在任意位置。
 *         * 可使用的值定义在ElementType枚举类中，常用值如下
 *             TYPE，类，接口
 *             FIELD, 成员变量
 *             METHOD, 成员方法
 *             PARAMETER, 方法参数
 *             CONSTRUCTOR, 构造方法
 *             LOCAL_VARIABLE, 局部变量
 *
 *    2.@Retention
 *         * 作用：用来标识注解的生命周期(有效范围)
 *         * 可使用的值定义在RetentionPolicy枚举类中，常用值如下
 *             * SOURCE：注解只作用在源码阶段，生成的字节码文件中不存在
 *                  - 代表@Override，只在编译期起作用，class字节码文件中已经不存在注解
 *             * CLASS：注解作用在源码阶段，字节码文件阶段，运行阶段不存在，默认值
 *                  - 编译期会起作用，class字节码文件也存在注解，但是运行阶段是没有的
 *             * RUNTIME：注解作用在源码阶段，字节码文件阶段，运行阶段
 *                  - 编译期会起作用，class字节码文件也存在注解，运行阶段也会存在此注解，更适合自定义注解，反射可以获取运行阶段的注解
 */
@MyAnno3("注解在类上")
public class AnnotationDemo3 {
    private String name;
    @MyAnno3("注解在方法上")
    public void eat(@MyAnno3("注解在形参上") int a){

    }

    public static void main(String[] args) {
        AnnotationDemo3 demo = new AnnotationDemo3();
        demo.eat(3);
    }
}
//@Retention(RetentionPolicy.SOURCE)
//@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@interface MyAnno3 {
    String value();
}